#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# urltry.py
#       
#  Copyright 2012 Ángel Coto <codiasw@gmail.com>
#  
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#  
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details (http://www.gnu.org/licenses/gpl.txt)
#  

# Descripción:
# Este programa obtiene encabezados de un url y la página correspondiente.

# Historial de versión
# 1.0.0: * Versión inicial.  Lee el archivo de configuración urltry.conf y
#          utiliza el url definido en ese archivo para obtener encabezados de interés.
#          Además de los encabezados también obtiene la página correspondiente a ese url
#          y la guarda en archivo con extensión html.
#          Si en el archivo de configuración se ha definido un texto clave, éste es
#          buscado en la página descargada y reporta si ha sido encontrado o no.
# 1.1.0: * El "User Agent" cambia a "IE 9", para asegurar respuesta de muchos sitios.
#        * Puede definirse desde entrada de consola url y texto a buscar.  Opcionalmente
#          puede leerse estos parámetros desde archivo de configuración.

### Define la versión del programa
programa = 'urltry'
ver = '1.1.0'
copyright = 'Copyright (c) 2012 Ángel Coto <codiasw@gmail.com>'


import httplib, urlparse
from ConfigParser import SafeConfigParser
from sys import argv

ArchivoIni = 'urltry.conf'

class Sitio:
	
	def __init__(self, MetodoEntrada = 'archivo', Url = '', TextoClave = ''):
		self.EstadoCodigo = 0
		self.EstadoMensaje = ''
		self.Datos = ''
		self.UrlRedireccion = ''
		self.Url = ''
		self.UrlPartes = []
		self.TextoClave = ''
		self.Error = False
		self.UserAgent = 'safari'
		self.Server = ''
		self.Framework = ''
		
		if MetodoEntrada == 'archivo':
			if not self.ObtenerUrl():
				print('Falla al leer el url de archivo ini.')
				self.Error = True
			if not self.ObtenerTexto():
				print('Falla al obtener texto de archivo ini.')
				self.Error = True
		else:
			if Url <> '':
				self.Url = Url
				self.TextoClave = TextoClave
			else:
				print('El Url no puede ser una cadena vacía.')
				self.Error = True
		if not self.Error:
			self.DividirUrl(self.Url)
			self.TraeEncabezados(self.UrlPartes)
			self.TraeContenido(self.UrlPartes)
		else:
			print('Errores en parámetros de funcionamiento.')
		
	def ObtenerUrl(self):
		parser = SafeConfigParser()
		parser.read(ArchivoIni)
		try:
			self.Url = parser.get('datos_url','url')
			return True
		except:
			return False
		
	def ObtenerTexto(self):
		parser = SafeConfigParser()
		parser.read(ArchivoIni)
		try:
			self.TextoClave = parser.get('datos_url','texto_clave')
			return True
		except:
			return False
	
	def DividirUrl(self,Url2Div):
		self.UrlPartes = urlparse.urlparse(Url2Div)
		return self.UrlPartes
		
	def TraeEncabezados(self,Url2Get):
		#Crear objeto conexión
		conn = httplib.HTTPConnection(Url2Get[1]) #Crea la conexión
		conn.putrequest('HEAD',Url2Get[2]) #Hace el requerimiento al servidor
		conn.putheader('User-Agent',self.UserAgent)
		conn.endheaders()
#		conn.request('HEAD',Url2Get[2]) #Hace el requerimiento al servidor
		resp = conn.getresponse() #Obtiene la respuesta
#		print resp.getheaders()
		self.EstadoCodigo = resp.status
		self.EstadoMensaje = resp.reason
		self.UrlRedireccion = resp.getheader('location')
		self.Server = resp.getheader('server')
		self.Framework = resp.getheader('x-powered-by')
		if resp.getheader('x-aspnet-version'):
			self.Framework = self.Framework + ' - ' + resp.getheader('x-aspnet-version')
		conn.close()
		
	def TraeContenido(self,Url2Get):
		#Crear objeto conexión
		conn = httplib.HTTPConnection(Url2Get[1]) #Crea la conexión
		conn.putrequest('GET',Url2Get[2]) #Hace el requerimiento al servidor
		conn.putheader('User-Agent',self.UserAgent)
		conn.endheaders()
#		conn.request('GET',Url2Get[2]) #Hace el requerimiento al servidor
		resp = conn.getresponse() #Obtiene la respuesta
		self.Datos = resp.read()
		conn.close()
		
	def BuscaTextoClave(self):
		if self.TextoClave <> '':
			if self.TextoClave in self.Datos:
				CheckDeTextoClave =  'Encontrado'
			else:
				CheckDeTextoClave = 'No encontrado'
		else:
			CheckDeTextoClave = 'No se ha definido texto clave'
		return CheckDeTextoClave
		
def main():
	
	def HintDeUso():
		print(' Obtiene encabezados de url y página respectiva.\n')
		print(' Uso: python {0} [?,-c]\n'.format(programa))
		print(' Opciones:')
		print('         <ninguna>: El url y texto clave se introducen desde teclado.')
		print('                -c: El url y texto clave se leen desde archivo de configuración.\n')
		print(' Este programa es software libre bajo licencia GPLv3.\n')

	def LeeParametros():
		ParametroOk = True
		try:
			Opcion = argv[1]
			if Opcion <> '-c':
				ParametroOk = False
		except:
			Opcion = None
		return ParametroOk, Opcion
	
	def NombreArchivo():
		if ':' in MiSitio.UrlPartes[1]:
			partes = MiSitio.UrlPartes[1].split(':')
			nombre = partes[0] + '.' + partes[1]
		else:
			nombre = MiSitio.UrlPartes[1]
		return nombre
		
	def Salida():
		print('\nUrl verificado      : ' + MiSitio.Url)
		print('Código de respuesta : ' + str(MiSitio.EstadoCodigo))
		print('Mensaje de respuesta: ' + MiSitio.EstadoMensaje)
		print('Server              : ' + str(MiSitio.Server))
		print('Framework           : ' + str(MiSitio.Framework))
		print('Url de redirección  : ' + str(MiSitio.UrlRedireccion))
		print('Texto clave         : ' + MiSitio.TextoClave)
		print('Check de texto clave: ' + MiSitio.BuscaTextoClave() + '\n')
	
	def CreaArchivo():
		ArchivoSalida = NombreArchivo() + '.html'
		fdata = open(ArchivoSalida,'w')
		fdata.write(MiSitio.Datos)
		fdata.close()
	
	print('{0} {1}. {2}\n'.format(programa,ver,copyright))
	
	ParametroOk, Opcion = LeeParametros()
	if ParametroOk:
		if Opcion == '-c':
			MiSitio = Sitio()
		else:
			Url = raw_input('URL (Ej: http://www.sitio.com): ')
			TextoClave = raw_input('Texto clave (opcional): ')
			MiSitio = Sitio('digitado', Url.strip(), TextoClave.strip())
		if not MiSitio.Error:
			Salida()
			CreaArchivo()
			raw_input('Enter para finalizar...')
	else:
		HintDeUso()

if __name__ == '__main__':
	main()
else:
	main()
